/*
 * Protocolo_NIPC.c
 *
 *  Created on: 22/10/2011
 *      Author: utn_so
 */

#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
#include "Protocolo_NIPC.h"

char* mensaje();//el proceso raid no tiene discos


int handshakePPD(int socket, char* identificador_disco) {
	paquete *NIPC;
	NIPC = (paquete*) malloc (sizeof(paquete));
	NIPC->type = 1;
	NIPC->payload_Length = strlen(identificador_disco);
	strcpy(NIPC->payload, identificador_disco);
	send(socket, NIPC, sizeof(paquete), 0);
	printf("Se envio todo muy lindo\n");
	paquete *recibirNIPC;
	recibirNIPC = (paquete*) malloc (sizeof(paquete));
	int length_recibido,resultado_operacion;
	length_recibido = recv(socket, recibirNIPC,sizeof(paquete), 0);
	printf("Recibi todo muy lindo\n");
	if (recibirNIPC->type == 0 && recibirNIPC->payload_Length == 0) {
		resultado_operacion = 0;
	} else {
		if(recibirNIPC->type == 0 && recibirNIPC->payload_Length != 0){
		resultado_operacion = 1;
		printf("%s",(char*)recibirNIPC->payload);}
	}
	return resultado_operacion;
}

paquete PPD_RECIBEPEDIDO_RAID (int socket, paquete *NIPC){
	recv(socket, &NIPC, sizeof(paquete),0);
	return *NIPC; // PARA QUE SEPA QUE TIPO DE PEDIDO ME HIZO
}

paquete PPD_MANDAPEDIDO_RAID (int socket, paquete *NIPC){
	send(socket, NIPC, sizeof(paquete),0);
	return *NIPC; // para que luego el raid se lo mande al FS.
}






int handshakePRAID_PPD(int socket, paquete *NIPC){
	paquete *enviarNIPC;
	int resultado;
	enviarNIPC = (paquete*)malloc(sizeof(paquete));
	if(NIPC->type==0){
		enviarNIPC->type = 0;
		strcpy(enviarNIPC->payload, "");
		enviarNIPC->payload_Length = strlen(enviarNIPC->payload);                /*si la conexion es correcta */
		send(socket, enviarNIPC, sizeof(paquete), 0);
		resultado = 1;
		return resultado;
	}
	else{                                              /*si la conexion es incorrecta */
		enviarNIPC->type = 0;
		strcpy(enviarNIPC->payload,"Se produjo un error en la conexion\n");
		enviarNIPC->payload_Length = strlen(enviarNIPC->payload);
		send(socket, enviarNIPC, sizeof(paquete), 0);
		close(socket);
	}
	resultado = 1;
			return resultado;
}

void handshakePRAID_FS(int socket, paquete *NIPC){
	recv(socket, NIPC,sizeof(paquete), 0);
	paquete *enviarNIPC;
	enviarNIPC = (paquete*) malloc (sizeof(paquete));
	if(NIPC->type==0){
		enviarNIPC->type = 0;
		enviarNIPC->payload_Length = 0;
		strcpy(enviarNIPC->payload, "");
		send(socket, enviarNIPC, sizeof(paquete), 0);
	}
	else{
		enviarNIPC->type = 0;
		enviarNIPC->payload_Length = 0;
		//enviarNIPC->payload = mensaje();
		send(socket, enviarNIPC, sizeof(paquete), 0);
		close(socket);
	}
}

void handshakeFS(int socket, paquete *NIPC){
	send(socket, NIPC,sizeof(paquete), 0);
	paquete *recibirNIPC;
	recibirNIPC = (paquete*) malloc (sizeof(paquete));
	recv(socket, recibirNIPC, sizeof(paquete), 0);
}

